home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / serien / purity / nr.12 / workshop / pascalkursiii.txt < prev    next >
Text File  |  1995-04-21  |  10KB  |  283 lines

  1.  
  2.  ========================================================================
  3.  =                   Systemprogrammierung in PCQ-Pascal                 =
  4.  =               Kurs für AmigaGadget/Purity - Teil III                 =
  5.  ========================================================================
  6.  
  7.  
  8.  Bisherige Kursteile :
  9.  
  10.     Teil I   : Voraussetzungen,Screens,Windows
  11.     Teil II  : Einfache Grafikausgabe
  12.  
  13.  
  14.  Was für ein Tag ! Stoltenberg ist zurückgetreten und ich muß jetzt
  15.  noch schnell Teil drei dieses Kurses fertigstellen.... Schwitz.
  16.  Also gut, wie versprochen : noch einige Grafikbefehle :
  17.  
  18.  im Include-File "Graphics/Text.i" finden sich unter anderem :
  19.  
  20.  GText (window^.RPort,string,count) - Gibt einen Text, der in der
  21.                                       Variable string gespeichert ist
  22.                                       count Zeichen lang aus.
  23.                                       Normalerweise setzt man count:=
  24.                                       StrLen (string);
  25.  
  26.  TextLength (window^.RPort,string,count) - Gibt die Anzahl der Pixel an,
  27.                                            die von count Zeichen des
  28.                                            Strings string benötigt
  29.                                            werden würden. Normalerweise
  30.                                            Zeichen*8, aber seit Kick2.0
  31.                                            sollte man da vorsichtig sein...
  32.  
  33.  In den Includes "Graphics/Pens.i" und "Graphics/RastPort.i" erschließt
  34.  sich uns eine neue Dimension der Grafikausgabe :
  35.  
  36.  gefüllte Flächen. Damit man diese darstellen kann, muß man vorerst
  37.  eine sogenannte TmpRas-Struktur einrichten und dem Rastport
  38.  einverleiben. Dies geschieht mit :
  39.  
  40.  InitTmpRas (TmpRasPtr , Buffer , Buffersize) - Initialisiert eine solche
  41.                                                 Struktur. Wie sieht das
  42.                                                 Teil nun aus ?
  43.  
  44.     TmpRas = record
  45.         RasPtr  : Address;
  46.         Size    : Integer;
  47.     end;
  48.  
  49.     Yo, was wollen uns diese Variablen sagen ? Nun, RasPtr wird von
  50.     InitTmpRas besetzt und Size können wird mit der im File
  51.     "Graphics/Gfx.i" besetzt. Also : Size:=RASSIZE (Breite,Hoehe);
  52.  
  53.     Buffer ist ein Zeiger auf ein vorher zu belegendes Raster.
  54.     Dieses wird mit Buffer:=AllocRaster (Breite,Hoehe) belegt.
  55.  
  56.     Buffersize letztendlich kann wieder mit RASSIZE berechnet werden :
  57.     Buffersize:=RASSIZE (Breite,Hoehe).
  58.  
  59.     Normalerweise verwendet man für Breite und Hoehe die entsprechenden
  60.     Ausmaße des Fensters.
  61.  
  62.     Das ganze wird dann in die Windowstruktur eingebunden :
  63.     window^.RPort^.TmpRas:=TmpRasPtr;
  64.  
  65.  Flood (window^.RPort,mode,x,y) - füllt eine zusammenhänge Fläche, in der
  66.                                   der Punkt P (x/y) enthalten ist. Mode
  67.                                   wird in der Regel 1 sein, Mode 0 benötigt
  68.                                   eine Umrandungslinie mit dem AOlPen und
  69.                                   ist an sich unnötig....
  70.  
  71.  Es gibt noch einige andere Flächenformen, die zwar einfacher zu hand-
  72.  haben sind, die aber noch einiges weiteres an Strukturkram benötigen.
  73.  Deshalb : heute nicht ! Ein anderes Mal mehr dazu.
  74.  
  75.  Nun wollen wir uns zwei Procedure schreiben, die uns die Arbeit verkürzen.
  76.  Nämlich in etwa so :
  77.  
  78.  PROCEDURE Print (rp : Address; xs , ys : Short; stext : String);
  79.  
  80.  BEGIN
  81.   Move (rp,xs,ys);
  82.   GText (rp,stext,StrLen(stext));
  83.  END;
  84.  
  85.  und
  86.  
  87.  PROCEDURE InitialisiereRaster (itmpras : TmpRasPtr; VAR ARaster : Address;
  88.                             width , height : Short ; swindow : WindowPtr);
  89.  
  90.  BEGIN
  91.   ARaster:=AllocRaster(width,height);
  92.   WITH itmpras^ DO
  93.   BEGIN
  94.    RasPtr := NIL;
  95.    Size := RASSIZE (width,height);
  96.   END;
  97.   InitTmpRas (itmpras , ARaster , RASSIZE (width,height));
  98.   swindow^.RPort^.TmpRas := itmpras;
  99.  END;
  100.  
  101.  Und nicht vergessen : Wenn man das Programm beendet, dann sollte man
  102.  das belegte Raster mit FreeRaster (Buffer,Breite,Hoehe); wieder
  103.  freigeben.
  104.  
  105.  Machen wir halt mal ein kloines Beispiel :
  106.  
  107.         Program KursProgramm;
  108.  
  109.         { Listing für den AMIGAGadget/Purity - Pascalkurs ,            }
  110.         { Dritte Schritte in der Grafikprogrammierung                  }
  111.  
  112.         {$I "Include:Intuition/Intuition.I" }
  113.         {$I "Include:Exec/Libraries.I"      }
  114.         {$I "Include:Graphics/Graphics.I"   }
  115.         {$I "Include:Libraries/Dos.I"       }
  116.         {$I "Include:Graphics/Pens.I"       }
  117.         {$I "Include:Graphics/Rastport.I"   }
  118.         {$I "Include:Utils/Stringlib.I"     }
  119.  
  120.         VAR
  121.                 myscreen : ScreenPtr;
  122.                 mywindow : WindowPtr;
  123.  
  124.  
  125.  
  126.         PROCEDURE Line (rp : Address ; xs , ys , xe , ye : Short);
  127.  
  128.         BEGIN
  129.          Move (rp , xs , ys); Draw (rp , xe , ye);
  130.         END;
  131.  
  132.  
  133.         PROCEDURE Box (rp : Address ; xs , ys , xe , ye : Short);
  134.  
  135.         BEGIN
  136.          Line (rp,xs,ys,xe,ys); Line (rp,xe,ys,xe,ye);
  137.          Line (rp,xe,ye,xs,ye); Line (rp,xs,ye,xs,ys);
  138.         END;
  139.  
  140.         PROCEDURE Print (rp : Address; xs , ys : Short; stext : String);
  141.  
  142.         BEGIN
  143.          Move (rp,xs,ys);
  144.          GText (rp,stext,StrLen(stext));
  145.         END;
  146.  
  147.         PROCEDURE InitialisiereRaster (itmpras : TmpRasPtr;
  148.                                        VAR ARaster : Address;
  149.                                        width , height : Short ;
  150.                                        swindow : WindowPtr);
  151.  
  152.         BEGIN
  153.          ARaster:=AllocRaster(width,height);
  154.          WITH itmpras^ DO
  155.          BEGIN
  156.           RasPtr := NIL;
  157.           Size := RASSIZE (width,height);
  158.          END;
  159.          InitTmpRas (itmpras , ARaster , RASSIZE (width,height));
  160.          swindow^.RPort^.TmpRas := itmpras;
  161.         END;
  162.  
  163.  
  164.         PROCEDURE CloseDisplay;
  165.  
  166.         VAR i : Integer;
  167.  
  168.         { Sollte ein Teil des Displays offen sein, dann wird er von }
  169.         { dieser Routine geschlossen.                               }
  170.  
  171.         BEGIN
  172.          IF mywindow<>NIL THEN
  173.           CloseWindow (mywindow);
  174.          IF myscreen<>NIL THEN
  175.           CloseScreen (myscreen);
  176.          IF GfxBase<>NIL THEN
  177.           CloseLibrary (GfxBase);
  178.         END;
  179.  
  180.  
  181.         PROCEDURE BreakProgram (reason : STRING);
  182.  
  183.         { Diese Routine schließt alles bisher geöffnete, druckt den }
  184.         { Fehlergrund aus und bricht dann das Programm ab.          }
  185.  
  186.         BEGIN
  187.          CloseDisplay;
  188.          WRITELN ('Program error : ',reason);
  189.          Exit (42);
  190.         END;
  191.  
  192.         PROCEDURE OpenLibs;
  193.  
  194.         CONST   GraphicName : String = "graphics.library";
  195.  
  196.         BEGIN
  197.          GfxBase:=OpenLibrary (GraphicName,0);
  198.         END;
  199.  
  200.  
  201.         PROCEDURE OpenDisplay;
  202.  
  203.         { Diese Routine erstellt ein Display.                       }
  204.  
  205.         CONST
  206.                 mynewscreen : NewScreen = (0,0,640,256,2,0,1,HIRES,
  207.                                             CUSTOMSCREEN_f,NIL,
  208.                                             NIL,NIL,NIL);
  209.  
  210.         NewWin   : NewWindow =  (100,50,320,128,0,1,0,
  211.                                 SMART_REFRESH+WINDOWDRAG+
  212.                                 ACTIVATE+SMART_REFRESH,NIL,NIL,
  213.                                 "Unsere neuen schicken Befehle !",
  214.                                 NIL,NIL,0,0,0,0,CUSTOMSCREEN_f);
  215.  
  216.         BEGIN
  217.           myscreen := OpenScreen (Adr(mynewscreen));
  218.           IF myscreen=NIL THEN BreakProgram ("Couldn't open Screen");
  219.           NewWin.Screen:=myscreen;
  220.           mywindow := OpenWindow (Adr(NewWin));
  221.           IF mywindow=NIL THEN BreakProgram ("Couldn't open Window");
  222.         END;
  223.  
  224.         PROCEDURE NeueBefehle;
  225.  
  226.         {Demonstration der neuen Befehle.                           }
  227.  
  228.         VAR MyTmpRas : TmpRas;
  229.             MyRaster : Address;
  230.  
  231.  
  232.         BEGIN
  233.          {Ganz am Anfang eine kleine Textausgabe                    }
  234.          SetAPen (mywindow^.RPort,1);
  235.          Print (mywindow^.RPort,10,20,"Hello World ! Let's have some");
  236.          Print (mywindow^.RPort,10,28,"NEW GRAPHIC FUNCTIONS !!!");
  237.          {Zuersteinmal Initialisierung der benötigten Strukturen.   }
  238.          InitialisiereRaster (Adr(MyTmpRas),MyRaster,mywindow^.Width,
  239.                               mywindow^.Height,mywindow);
  240.          {Und dann einen Kreis, der von uns gefüllt wird !          }
  241.          DrawCircle (mywindow^.RPort,60,70,20);
  242.          Flood (mywindow^.RPort,1,60,70);
  243.          {Auch noch ein gefülltes Dreieck....                       }
  244.          Line (mywindow^.RPort,110,60,180,85);
  245.          Line (mywindow^.RPort,180,85,100,70);
  246.          Line (mywindow^.RPort,100,70,110,60);
  247.          Flood (mywindow^.RPort,1,120,65);
  248.          {Und wieder ein wenig Text                                 }
  249.          SetAPen (mywindow^.RPort,3);
  250.          Print (mywindow^.RPort,10,110,"Das war's. See U later.");
  251.          FreeRaster (MyRaster,mywindow^.Width,mywindow^.Height);
  252.         END;
  253.  
  254.         PROCEDURE WarteEinWenig;
  255.  
  256.         BEGIN
  257.           Delay (1000);
  258.         END;
  259.  
  260.         BEGIN
  261.           OpenLibs;
  262.           OpenDisplay;
  263.           NeueBefehle;
  264.           WarteEinWenig;
  265.           CloseDisplay;
  266.         END.
  267.  
  268.   Es gäbe noch sehr viel über Grafik und ihre Anwendung zu erzählen, doch
  269.   finde ich es wichtiger, die Brücke zum Anwender zu schlagen, will
  270.   sagen, im nächsten Teil mit dem Kapitel Messages zu beginnen.
  271.   (Klingt geheimnisvoll, oder ?)
  272.  
  273.   Wer Kritik oder Lob für diesen Kurs, Verbesserungsvorschläge oder
  274.   Fragen (es gibt keine dummen Fragen !!) hat, melde sich entweder bei mir
  275.  
  276.     Andreas Neumann ; Auf dem Ruhbühl 151 ; 7997 Immenstaad
  277.  
  278.   oder in der Purity. Bye.
  279.  
  280.     © 1992 by Andreas Neumann für AmigaGadget von Nils Kassube
  281.                               und Purity von Steppenbrand und Diesel
  282.  
  283.